package com.fanghaoran.notes.util;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @Author: win11
 * @Date: 2023/03/14/16:56
 * @Description:
 *
 * 写一个工具类,内含连接池对象,只允许实例化一次,同时提供连接和回收连接的方法
 *
 * 工具类的方法一般使用静态
 */
public class JdbcUtil {
    /**
     * 连接池对象作为类的私有静态属性
     */
    private static DataSource dataSource=null;
    /**
     * 线程本地变量
     */
    private final static ThreadLocal<Connection> TL=new ThreadLocal<>();

    //静态代码块初始化连接池对象
    static{
        //加载外部配置文件
        Properties properties=new Properties();
        //利用类加载器
        InputStream ips = JdbcUtil.class.getClassLoader().getResourceAsStream("db.properties");
        try {
            properties.load(ips);
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * 对外提供获得连接的方法
     */
    public static Connection getConnection() throws SQLException {
        Connection connection = TL.get();
        //判断线程本地变量是否有存储Connection
        if(connection==null){
            //没有 连接池创建连接
            connection  = dataSource.getConnection();
            //放入线程本地变量
            TL.set(connection);
        }
        return connection;
    }

    /**
     * 对外提供回收连接的方法
     */
    public static void freeConnection() throws SQLException {
        Connection connection = TL.get();
        if(connection!=null){
            //清空线程本地变量
            TL.remove();
            //让连接回归事务关闭状态
            connection.setAutoCommit(true);
            //回收连接
            connection.close();
        }
    }
}
